/**
  ******************************************************************************
  * @file     SD93F115B_uart.c
  * @author   TEST TEAM 												    	
  * @version  v0															    	
  * @date     Septemper 2022												    	
  * @brief
  *
  * Copyright (C) 2022  Hangzhou SDIC Microelectronics Co., Ltd
**********************************************************************************/
#include "SD93F115B_uart.h"
#include "SD93F115B_rcc.h"

/*-------------------------------------------------
 * 函数功能：将UART相关寄存器值恢复为上电默认值 
 * 入口参数：UARTx: UART0,UART1
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
void UART_DeInit(UART_TypeDef* UARTx)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx)); 
	
    if(UARTx==UART0)
	{
		RCC_APBPeriphResetCmd(RCC_APBPeriph_UART0, ENABLE);
		RCC_APBPeriphResetCmd(RCC_APBPeriph_UART0, DISABLE); 
	}
	else if(UARTx==UART1)
	 {
		RCC_APBPeriphResetCmd(RCC_APBPeriph_UART1, ENABLE);
        RCC_APBPeriphResetCmd(RCC_APBPeriph_UART1, DISABLE); 
	 }
}

/*-------------------------------------------------
 * 函数功能：获取当前的系统时钟   
 * 入口参数：None
 * 出口参数：None
 * 返回值  ：系统时钟的具体值，单位：Hz
 * 编写日期：
 * 作者    ：
 *-------------------------------------------------*/
uint32_t UART_GetSYSCLK(void)
{
	uint32_t fsys=0;
	uint8_t fsyss=0,tmpreg1=0;
	
	if(RCC->MCLK_CFGR&MCLK_CFGR_SW)
		fsys = (uint32_t)(RCC_ClockValue_IHRC/2);
	else
	{
		fsyss=(RCC->MCLK_CFGR & 0x000000E0)>>5;
		tmpreg1=(RCC->MCLK_CFGR & 0x0000000C)>>2;

		switch(tmpreg1)
		{
			case 0:
				tmpreg1=1;
				break;
			case 1:
				tmpreg1=2;
				break;
			case 2:
				tmpreg1=4;
				break;
			case 3:
				tmpreg1=8;
				break;
			default:
				break;
		}
		switch(fsyss)
		{
			case 0:
				fsys=(uint32_t)(RCC_ClockValue_IHRC/tmpreg1);
				break;
			case 1:
				fsys=(uint32_t)(RCC_ClockValue_ILRC/tmpreg1);
				break;
			case 2:
				fsys=(uint32_t)(RCC_ClockValue_XTOSC1/tmpreg1);
				break;
			case 3:
				fsys=(uint32_t)(RCC_ClockValue_XTOSC2/2/tmpreg1);
				break;
			default:
				break;
		}
	}
	return fsys;
	
} 
/*----------------------------------------------
 * 函数功能：获取UART的工作时钟   
 * 入口参数：UARTx: UART0,UART1
 * 出口参数：None
 * 返回值  ：UART的工作时钟，单位：Hz   
 * 编写日期：
 * 作者    ：
 *----------------------------------------------*/
uint32_t UART_GetClock(UART_TypeDef* UARTx)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx)); 

	uint32_t fuartclk=0;
	
	if(UARTx==UART1)
	{
		if((RCC->APB_CFGR2 & 0x03000000)==0) 
		{
			fuartclk = RCC_ClockValue_IHRC ;
		}
		else
			if((RCC->APB_CFGR2 & 0x03000000)==0x01000000) 
		    {
				fuartclk = RCC_ClockValue_XTOSC2;
		    }
			else
				if((RCC->APB_CFGR2 & 0x03000000)==0x02000000) 
				{
					fuartclk = UART_GetSYSCLK();
				}
	}
	else
	{
		if((RCC->APB_CFGR2 & 0x00300000)==0) 
		{
			fuartclk = RCC_ClockValue_IHRC ;
		}
		else
			if((RCC->APB_CFGR2 & 0x00300000)==0x00100000) 
		    {
				fuartclk = RCC_ClockValue_XTOSC2;
		    }
			else
				if((RCC->APB_CFGR2 & 0x00300000)==0x00200000) 
				{
					fuartclk = UART_GetSYSCLK();
				}
	}
    return fuartclk;                                                
}

/*----------------------------------------------------------------------
 * 函数功能：初始化UART
 * 入口参数：UARTx: UART0,UART1
 *			 UART_InitStruct: pointer to a UART_InitStruct structure that
 *           contains the configuration information for the specified UART peripheral.
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------------------------*/
void UART_Init(UART_TypeDef* UARTx, UART_InitTypeDef* UART_InitStruct)
{ 
	uint32_t  tmpreg=0,fuartclk=0;
	uint16_t sbrt=0,sfine = 0;
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_UART_BuadRate(UART_InitStruct->UART_BaudRate));  
	assert_param(IS_UART_Word_Length(UART_InitStruct->UART_WordLength));
	assert_param(IS_UART_StopBits(UART_InitStruct->UART_StopBits));
	assert_param(IS_UART_Parity(UART_InitStruct->UART_Parity));
	assert_param(IS_UART_Mode(UART_InitStruct->UART_Mode));
	assert_param(IS_UART_CarryWave(UART_InitStruct->UART_CarryWave));
  
	//Disable UART 
	UARTx->CR &= (uint32_t)~(UART_CR_UE);	
	
	tmpreg=UARTx->CR&0xFFFFE000;
	
	tmpreg|=UART_InitStruct->UART_CarryWave|UART_InitStruct->UART_Parity|
	        UART_InitStruct->UART_StopBits|UART_InitStruct->UART_WordLength|UART_InitStruct->UART_Mode;

	UARTx->CR = tmpreg; 

	//BaudRate
	fuartclk=UART_GetClock(UARTx);
	
	sbrt=4096-fuartclk/8/(UART_InitStruct->UART_BaudRate);
	sfine=fuartclk/(UART_InitStruct->UART_BaudRate)-(4096-sbrt)*8;
	UARTx->BRR=((sbrt<<3)|sfine);
	
}

/*--------------------------------------------------------
 * 函数功能：初始化UART为常规应用
 * 入口参数：结构体变量指针(&UART_InitStruct)
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------------*/
void UART_StructInit(UART_InitTypeDef* UART_InitStruct)
{
  /* UART_InitStruct members default value */
  UART_InitStruct->UART_BaudRate = 9600;                  //波特率为9600
  UART_InitStruct->UART_WordLength = UART_WordLength_8b;  //数据长度8位
  UART_InitStruct->UART_StopBits = UART_StopBits_1;       //1位停止位
  UART_InitStruct->UART_Parity = UART_Parity_None;        //无校验
  UART_InitStruct->UART_CarryWave = UART_CarryWave_None;  //关闭载波功能
  UART_InitStruct->UART_Mode = UART_Mode_TRx;             //接收和发送使能  
}

/*-------------------------------------------------------------
 * 函数功能：UART使能
 * 入口参数：UARTx: UART0,UART1
 *			 NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------*/
void UART_Cmd(UART_TypeDef* UARTx, FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{

		UARTx->CR |= UART_CR_UE;
	}
	else
	{
		UARTx->CR &= ~UART_CR_UE;
	}
}
/*------------------------------------------------------------------------
 * 函数功能：使能自动波特率检测
 * 入口参数：UARTx: UART0,UART1
 *			 NewState: ENABLE或者DISABLE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------------------*/
void UART_AutoBaudRateCmd(UART_TypeDef* UARTx, FunctionalState NewState)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	if (NewState != DISABLE)
	{

		UARTx->CR |= UART_CR_ABREN;
	}
	else
	{
		UARTx->CR &= ~UART_CR_ABREN;
	}
}

/*------------------------------------------------------
 * 函数功能：发送数据
 * 入口参数：UARTx: UART0,UART1
 *			 Data：5~9位数据
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------*/
void UART_SendData(UART_TypeDef* UARTx, uint16_t Data)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_UART_Data(Data));     
	UARTx->TDR = (Data & (uint16_t)0x01FF);
}

/*----------------------------------------------------
 * 函数功能：接收数据
 * 入口参数：UARTx: UART0,UART1
 * 出口参数：UARTx->RDR
 * 返回值  ：UART接收的数据
 * 编写日期：
 * 作者    ：
 *----------------------------------------------------*/
uint16_t UART_ReceiveData(UART_TypeDef* UARTx)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));  
	return (uint16_t)(UARTx->RDR & (uint16_t)0x01FF);
	
}

/*------------------------------------------------------------------------------------
 * 函数功能：中断初始化
 * 入口参数：UARTx: UART0,UART1
 * 		     UART_IT:中断源可选择 UART_IT_RXNEIE,UART_IT_TXEIE,UART_IT_TCIE,UART_IT_FEIE,UART_IT_EIE,UART_IT_WKUPIE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------------------------------*/
void UART_ITConfig(UART_TypeDef* UARTx, uint32_t UART_IT, FunctionalState NewState)
{
  /* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_UART_ITSource(UART_IT));
	assert_param(IS_FUNCTIONAL_STATE(NewState));
	
	if(NewState==ENABLE)
	{
		UARTx->CR |=(uint32_t)(UART_IT);
	}
	else
	{
		UARTx->CR &=(uint32_t)~(UART_IT);
	}
}

/*------------------------------------------------------------------------
 * 函数功能：读UART标志位状态
 * 入口参数：UARTx: UART0,UART1
 *			 UART_Flag: UART_Flag_RXNE,UART_Flag_TXE,UART_Flag_TC,UART_Flag_FE\
 *           UART_Flag_ORE,UART_Flag_NE,UART_Flag_PE,UART_Flag_WKUPF,UART_Flag_ABRE
 * 出口参数：bitstatus
 * 返回值  ：UART标志位状态
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------------------*/ 
FlagStatus UART_GetFlagStatus(UART_TypeDef* UARTx, uint32_t UART_Flag)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_UART_StatusFlag(UART_Flag));
	
	FlagStatus bitstatus = RESET;
	
	if((UARTx->SR & UART_Flag)!=(uint16_t)RESET)
	{
		bitstatus= SET; 				
	}
	else
	{
		bitstatus= RESET; 
	}
	
	return bitstatus;  
}

/*--------------------------------------------------------------------
 * 函数功能：清零UARTUART_Flag标志位状态
 * 入口参数：UARTx: UART0,UART1
 *			 UART_Flag: UART_Flag_RXNE,UART_Flag_TXE,UART_Flag_TC,UART_Flag_FE\
 *           UART_Flag_ORE,UART_Flag_NE,UART_Flag_PE,UART_Flag_WKUPF,UART_Flag_ABRE
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *--------------------------------------------------------------------*/ 
void UART_ClearFlagStatus(UART_TypeDef* UARTx, uint32_t UART_Flag)
{
	/* Check the parameters */
	assert_param(IS_UART_ALL_PERIPH(UARTx));
	assert_param(IS_UART_ClearFlag(UART_Flag));	
		
	UARTx->SR |= UART_Flag;						     //软件写1清零
	
}

/*------------------------------------------------------------------------
 * 函数功能：UART1通信接口映射选择
 * 入口参数：UART1_IOMAP:UART1_IOMAP_P36_P37、UART1_IOMAP_SWCLK_SWDIO
 * 出口参数：None
 * 返回值  ：None
 * 编写日期：
 * 作者    ：
 *------------------------------------------------------------------------*/
void UART_UART1_IOMAP(uint8_t UART1_IOMAP)
{
	/* Check the parameters */
	assert_param(IS_UART_UART1_IOMAP(UART1_IOMAP));
	if (UART1_IOMAP == UART1_IOMAP_SWCLK_SWDIO)
	{

		DBGMCU->CR |= BOOT_UART1_IOMAP;
	}
	else
	{
		DBGMCU->CR &= ~BOOT_UART1_IOMAP;
	}
}
/*****************************END OF FILE********************************/